﻿//992. K 个不同整数的子数组
//给定一个正整数数组 nums和一个整数 k，返回 nums 中 「好子数组」 的数目。
//如果 nums 的某个子数组中不同整数的个数恰好为 k，则称 nums 的这个连续、不一定不同的子数组为 「好子数组 」。
//例如，[1, 2, 3, 1, 2] 中有 3 个不同的整数：1，2，以及 3。
//子数组 是数组的 连续 部分。



class Solution {
public:
    int f(vector<int>& nums, int k)
    {
        unordered_map<int, int> cnt;
        int left = 0;
        int ans = 0;
        for (auto e : nums)
        {
            cnt[e]++;
            while (cnt.size() >= k)
            {
                int out = nums[left];
                cnt[out]--;
                if (cnt[out] == 0) cnt.erase(out);
                left++;
            }
            ans += left;
        }
        return ans;
    }

    int subarraysWithKDistinct(vector<int>& nums, int k)
    {
        return f(nums, k) - f(nums, k + 1);
    }
};